package ml.kupin.service.impl;

import com.alibaba.fastjson.JSON;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import ml.kupin.common.constant.KuPinConstant;
import ml.kupin.common.jedis.JedisClient;
import ml.kupin.mapper.TbItemDescMapper;
import ml.kupin.mapper.TbItemMapper;
import ml.kupin.pojo.TbItem;
import ml.kupin.pojo.TbItemDesc;
import ml.kupin.pojo.TbItemExample;
import ml.kupin.service.ItemService;
import ml.kupin.common.utils.IdUtils;
import ml.kupin.common.utils.KuPinResult;
import ml.kupin.common.vo.EasyUIDataGridResult;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.jms.*;
import java.util.Date;
import java.util.List;

/**
 * Created by 小柯(Allen Kerr) on 17.4.24 14:49.
 */
@Service
public class ItemServiceImpl implements ItemService {

    @Autowired
    private TbItemMapper itemMapper;
    @Autowired
    private TbItemDescMapper tbItemDescMapper;
    //注入一个 jmsTemplate 对象
    @Autowired
    private JmsTemplate jmsTemplate;
    //@Resource注解：根据id注入
    //注入一个 topicDestination 对象
    @Resource
    private Destination topicDestination;
    @Autowired
    private JedisClient jedisClient;

    /**
     * ##########################
     * # 商品信息在redis缓存中的key
     * #   Item_info:id值:basic
     * #   Item_info:id值:desc
     * ##########################
     * # 商品信息在redis缓存中的key前缀和后缀
     * item_info_prefix=Item_info:
     * item_info_basic_suffix=:basic
     * item_info_desc_suffix=:desc
     * # 商品信息在redis缓存中的存活时间，单位：秒，推荐值：3600，即一小时
     * item_info_lifetime=3600
     */
    @Value("${item_info_prefix}")
    private String item_info_prefix;
    @Value("${item_info_basic_suffix}")
    private String item_info_basic_suffix;
    @Value("${item_info_desc_suffix}")
    private String item_info_desc_suffix;
    @Value("${item_info_lifetime}")
    private Integer item_info_lifetime;


    private Logger logger = LoggerFactory.getLogger(ItemServiceImpl.class);

    /**
     * 通过商品id获取商品信息，添加redis缓存
     *
     * @param id
     * @return
     */
    @Override
    public TbItem getItemById(Long id) {
        /**
         * 商品信息在redis缓存中的key:
         *              Item_info:id值:basic
         *              Item_info:id值:desc
         */
        //1. 查询redis缓存
        try {
            String json = jedisClient.get(item_info_prefix + id + item_info_basic_suffix);
            if (StringUtils.isNotBlank(json)) {
                //重设缓存生存时间
                jedisClient.expire(item_info_prefix + id + item_info_basic_suffix, item_info_lifetime);
                TbItem item = JSON.parseObject(json, TbItem.class);
                return item;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        //2.1 如果缓存中没有，再去数据库中查询
        TbItem item = itemMapper.selectByPrimaryKey(id);
        //2.2 将从数据库中查询到的信息添加到缓存中
        try {
            jedisClient.set(item_info_prefix + id + item_info_basic_suffix, JSON.toJSONString(item));
            //缓存生存时间
            jedisClient.expire(item_info_prefix + id + item_info_basic_suffix, item_info_lifetime);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return item;
    }

    /**
     * 分页查询商品信息
     *
     * @param page
     * @param rows
     * @return
     */
    @Override
    public EasyUIDataGridResult<TbItem> getItems(int page, int rows) {
        //设置分页信息
        PageHelper.startPage(page, rows);
        //查询商品
        TbItemExample itemExample = new TbItemExample();
        List<TbItem> items = itemMapper.selectByExample(itemExample);
        //获取查询结果
        PageInfo<TbItem> pageInfo = new PageInfo<>(items);
        Long total = pageInfo.getTotal();
        //返回
        return new EasyUIDataGridResult<TbItem>(total, items);
    }

    /**
     * 添加商品功能
     *
     * @param item
     * @param desc
     * @return
     */
    @Override
    public KuPinResult addItem(TbItem item, String desc) throws Exception {
        //获取商品id
        final long id = IdUtils.genItemId();
        try {
            //获取时间
            Date addAndUpdateTime = new Date();
            //封装商品数据，插入商品表中
            item.setId(id);
            item.setStatus(KuPinConstant.Item_Normal);//1-正常，2-下架，3-删除
            item.setCreated(addAndUpdateTime);
            item.setUpdated(addAndUpdateTime);
            itemMapper.insert(item);

            //抛出异常
//            int i = 1 / 0;

            //封装商品描述信息，插入商品描述表中
            TbItemDesc itemDesc = new TbItemDesc(id, addAndUpdateTime, addAndUpdateTime, desc);
            tbItemDescMapper.insert(itemDesc);

            //======向kupin-search和kupin-item-web模块发送消息，提醒前者更新solr缓存，提醒后者生成静态页面======
            jmsTemplate.send(topicDestination, new MessageCreator() {
                @Override
                public Message createMessage(Session session) throws JMSException {
                    TextMessage textMessage = session.createTextMessage(id + "");
                    return textMessage;
                }
            });
            //======向kupin-search和kupin-item-web模块发送消息，提醒前者更新solr缓存，提醒后者生成静态页面======

        } catch (Exception e) {
            logger.error("商品 " + item.getTitle() + " 添加失败！");
            e.printStackTrace();
            throw e;
        }
        logger.info("商品 【" + item.getTitle() + "】 添加成功，商品id为 " + id + "！");
        //返回添加成功的消息
        return KuPinResult.ok();
    }

    /**
     * 商品上架、下架、删除功能
     *
     * @param id
     * @return
     * @throws Exception
     */
    @Override
    public KuPinResult updateStatus(long id, byte status) throws Exception {
        try {
            //获取商品Id，封装对象，更新
            TbItem item = new TbItem();
            item.setId(id);
            item.setStatus(status);
            item.setUpdated(new Date());
            itemMapper.updateByPrimaryKeySelective(item);
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }
        //更新成功的信息
        return KuPinResult.ok();
    }

    /**
     * 查询商品描述，回显到商品编辑页面上去，所以需要封装到kuPinResult对象中
     *
     * @param itemId
     * @return
     */
    @Override
    public KuPinResult findItemDesc(long itemId) {
        TbItemDesc itemDesc = tbItemDescMapper.selectByPrimaryKey(itemId);
        return KuPinResult.ok(itemDesc);
    }

    /**
     * 修改商品
     * 页面传递过来的数据：
     * id cid title sellPoint priceView price num barcode image desc itemParams itemParamId
     * ————商品表；id cid title sellPoint priceView price num barcode image
     * ————商品描述表：desc
     * ————商品规格表：itemParamId itemParams
     */
    @Override
    public KuPinResult updateItem(TbItem item, String desc) throws Exception {
        try {
            //获取时间
            Date updateTime = new Date();
            //封装商品数据，修改商品表，按id来
            item.setUpdated(updateTime);
            itemMapper.updateByPrimaryKeySelective(item);

            //抛出异常
//            int i = 1 / 0;

            //封装商品描述信息，修改商品描述表，按id来
            TbItemDesc itemDesc = new TbItemDesc(item.getId(), null, updateTime, desc);
            tbItemDescMapper.updateByPrimaryKeySelective(itemDesc);
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }
        //返回修改成功的消息
        return KuPinResult.ok();
    }

    /**
     * 根据商品id查找商品描述信息，添加redis缓存
     *
     * @param id
     * @return
     */
    @Override
    public TbItemDesc getItemDescById(Long id) {
        /**
         * 商品信息在redis缓存中的key:
         *              Item_info:id值:basic
         *              Item_info:id值:desc
         */
        //1. 查询redis缓存
        try {
            String json = jedisClient.get(item_info_prefix + id + item_info_desc_suffix);
            if (StringUtils.isNotBlank(json)) {
                //重设缓存生存时间
                jedisClient.expire(item_info_prefix + id + item_info_desc_suffix, item_info_lifetime);
                TbItemDesc itemDesc = JSON.parseObject(json, TbItemDesc.class);
                return itemDesc;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        //2.1 如果缓存中没有，再去数据库中查询
        TbItemDesc itemDesc = tbItemDescMapper.selectByPrimaryKey(id);
        //2.2 将从数据库中查询到的信息添加到缓存中
        try {
            jedisClient.set(item_info_prefix + id + item_info_desc_suffix, JSON.toJSONString(itemDesc));
            //缓存生存时间
            jedisClient.expire(item_info_prefix + id + item_info_desc_suffix, item_info_lifetime);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return itemDesc;
    }

    @Override
    public List<TbItem> findAll() {
        //为防止数据量过大，先查几条吧
        //设置分页信息
//        PageHelper.startPage(0, 10);
        //执行查询
        List<TbItem> itemList = itemMapper.selectByExample(new TbItemExample());
        return itemList;
    }
}
